package com.dh.leetcode.four;

import org.junit.Assert;
import org.junit.Test;

/**
 * @ClassName: _400_nth_digit
 * @Description: 400. 第 N 位数字
 * 给你一个整数 n ，请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位数字。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：n = 3
 * 输出：3
 * 示例 2：
 * <p>
 * 输入：n = 11
 * 输出：0
 * 解释：第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ，它是 10 的一部分。
 * <p>
 * <p>
 * 提示：
 * <p>
 * 1 <= n <= 231 - 1
 * <p>
 * https://leetcode-cn.com/problems/nth-digit/
 * @Author: shouzimu
 * @Date: 2021/11/30 10:10
 */
public class _400_nth_digit {
    /**
     * 找规律
     * 每一个期间总共的数字个数为  Math.pow(10, i) - Math.pow(10, i - 1)
     * 乘i的结果就是位数
     * @param n
     * @return
     */
    public int findNthDigit(int n) {
        int i = 1;
        int index = 1;
        int preIndex = 1;
        while (true) {
            double x = Math.pow(10, i) - Math.pow(10, i - 1);
            preIndex = index;
            index += x * i;
            if (index >= n) {
                break;
            }
            i++;
        }
        double start = Math.pow(10, i - 1);
        int q = n - preIndex;
        int w = q / i;
        Double v = start + w;
        String num = String.valueOf(v.intValue());
        int k = 0;
        for (; preIndex + w * i + k < n; k++) {
            if (k >= num.length()) {
                break;
            }
        }
        return num.charAt(k) - '0';
    }


    @Test
    public void findNthDigitTest() {
        Assert.assertEquals(findNthDigit(999999999), 9);
        Assert.assertEquals(findNthDigit(9),9);
        Assert.assertEquals(findNthDigit(111),0);
        Assert.assertEquals(findNthDigit(11),0);
        Assert.assertEquals(findNthDigit(100897), 4);
    }
}
